//
//  main.m
//  OC7_Block
//
//  Created by dllo on 15/11/3.
//  Copyright (c) 2015年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Student.h"

void test(void)
{
    printf("函数\n");
}

NSInteger glB = 5;

typedef void (^blockType)(void) ;

int main(int argc, const char * argv[]) {

//    void (*p)(void) = test;
//    
//    // block语法
//    // block1 - block名字
//    // block的实现在方法内部
//    void (^block1)(void) = ^(void) {
//    
//        NSLog(@"block1");
//        
//    };
//    // 调用
////    block1();
    
//    // 练习1 - 创建block, 实现打印指定次数的"block"
//
//    void (^block2)(NSInteger) = ^(NSInteger n) {
//        for (NSInteger i = 0; i < n ; i++) {
//            NSLog(@"block");
//        }
//    };
//    
//    // 调用
//    block2(3);
    

    
    // 练习2 - 创建block, 分别实现加减乘除四个功能
    
    // 加法
//    NSInteger (^add) (NSInteger, NSInteger) = ^(NSInteger a, NSInteger b) {
//        return a + b;
//    };
//    
//    // 调用
//    NSInteger ret = add(3, 5);
//    NSLog(@"%ld", ret);
    
    
    
    
    
    // 练习3 - 创建block, 判断某个数字是否为偶数(注意此题)
    
//    BOOL (^block3) (NSInteger) = ^(NSInteger a) {
//        if (0 == a % 2) {
//            return YES;
//        }
//        return NO;
//    };
//    
//    // 调用
//    BOOL ret = block3(5);
//    NSLog(@"%d", ret);
    
    
//    // 练习4 - 写一个返回值为整型 参数为NSString(进一个参数)的block, 实现将字符型转换为整型的功能
//    
//    int (^block4) (NSString *) = ^(NSString *a) {
//        return [a intValue];
//    };
//    
//    // 调用
//    int a = block4(@"35");
//    NSLog(@"%d", a);
//    
//    
//    
//    // 提高题 - 创建学生类,分别编写block判断两名学生的分数, 年龄,姓名的大小
//    
//    BOOL (^score)(Student *, Student *) = ^(Student *stu, Student *stu1) {
//        if ([stu score] > [stu1 score]) {
//            return YES;
//        }
//        return NO;
//    };
//    
//    BOOL (^age) (Student *, Student *) = ^(Student *stu, Student *stu1) {
//        if ([stu age] > [stu1 age]) {
//            return YES;
//        }
//        return NO;
//    };
//    
//    BOOL (^name) (Student *, Student *) = ^(Student *stu, Student *stu1) {
//        if ([[stu name] compare:[stu1 name]] > 0) {
//            return YES;
//        }
//        return NO;
//    };

    
    Student *stu1 = [[Student alloc] initWithName:@"WN" age:30 score:99.9];
        Student *stu2 = [[Student alloc] initWithName:@"WBN" age:23 score:89.3];
        Student *stu3 = [[Student alloc] initWithName:@"ZY" age:18 score:200.1];

    NSMutableArray *stuArr = [NSMutableArray arrayWithObjects:stu1, stu2, stu3, nil];
//
//    [stuArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//        
//        // 强制类型转换
//        // 将id类型强制转换成student类型
//        Student *s1 = (Student *)obj1;
//        Student *s2 = (Student *)obj2;
//        if (s1.score > s2.score) {
//            return NSOrderedDescending;
//        }
//        if (s1.score < s2.score) {
//            return NSOrderedAscending;
//        }
//        return NSOrderedSame;
//    }];
//
//    
//    [stuArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//        Student *s1 = (Student *)obj1;
//        Student *s2 = (Student *)obj2;
//        if (s1.age > s2.age) {
//            return NSOrderedDescending;
//        }
//        if (s1.age < s2.age) {
//            return NSOrderedAscending;
//        }
//        return NSOrderedSame;
//    }];
    
    
    
    // 对上例数组
//    1,按年龄升序排列
//    2,按年龄降序排列

    
//    [stuArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//        Student *s1 = (Student *)obj1;
//        Student *s2 = (Student *)obj2;
//        
//        if (s1.age < s2.age) {
//            return NSOrderedDescending;
//        }
//        if (s1.age > s2.age) {
//            return NSOrderedAscending;
//        }
//        return NSOrderedSame;
//    }];
    
    //    3,按姓名升序排列
    //    4,按姓名降序排列
    
//    [stuArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//        Student *s1 = (Student *)obj1;
//        Student *s2 = (Student *)obj2;
//        
//        return [s1.name compare:s2.name];
//    }];
//    
//    
//    
//    
//    for (Student *stu in stuArr) {
//        NSLog(@"%@ %F %ld", [stu name], [stu score], [stu age]);
//    }
    
    
    
//    // block与变量
//    
//    // block与局部变量:1, 只读局部变量; 2,若想修改, 可在局部变量定义处加__block声明
//    // block与全局变量:可以读和写
//    __block NSInteger a = 3;
//    blokTcype blocTeskt= ^(void) {
//        
//        glB = 3;
//        NSLog(@"%ld", glB);
//        
//        a = 5;
//        NSLog(@"%ld", a);
//    };
//    blockTest();
    
    
    
    
    
    
    
    
    
    
    
    return 0;
}
